package com.dc.free.util;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jfinal.kit.HttpKit;

/**
 * 渔山岛接口
 * @author quan
 *
 */
public class YuShanIsland {
	
	

	public static String userName = "dachang";
	public static String userPassword = "E10ADC3949BA59ABBE56E057F20F883E";
	
	public static final String IP = "39.107.89.119";
	public static final String PORT = "8080";
	public static final int EXPIRE_TIME = 50*60;
	public static final String SEPARATOR = "_";
	private static final Map<String, Authentication> authentications = new ConcurrentHashMap<String, Authentication>();
	
	/**
	 * 授权凭证
	 * @author quan
	 *
	 */
	public static final class Authentication {
		private String userName;
		private String userPassword;
		private String token;
		private String companyCode;
		private Date date = new Date();
		
		public Authentication(String userName, String userPassword) {
			super();
			this.userName = userName;
			this.userPassword = userPassword;
		}
		
		public Authentication(String userName, String userPassword, String token, String companyCode) {
			super();
			this.userName = userName;
			this.userPassword = userPassword;
			this.token = token;
			this.companyCode = companyCode;
		}

		public String getUserName() {
			return userName;
		}
		
		public void setUserName(String userName) {
			this.userName = userName;
		}
		
		public String getUserPassword() {
			return userPassword;
		}
		
		public void setUserPassword(String userPassword) {
			this.userPassword = userPassword;
		}

		public String getToken() {
			return token;
		}

		public void setToken(String token) {
			this.token = token;
		}

		public String getCompanyCode() {
			return companyCode;
		}

		public void setCompanyCode(String companyCode) {
			this.companyCode = companyCode;
		}

		public Date getDate() {
			return date;
		}
		
		public Long getInterval() {
			return new Date().getTime() - date.getTime();
		}
		
	}
	
	/**
	 * <ul>
	 * <li>AUTHENTICATION_URL 企业账号登录接口</li>
	 * <li>CITIZEN_INFO_URL 人员制证信息提交接口</li>
	 * <li>STATUS_URL 人员制证状态查询接口</li>
	 * <li>AREA_INFO_URL 所属连队查询接口</li>
	 * <li>HOUSE_HOLD_INFO_URL 户籍地区信息查询接口</li>
	 * <li>DEPT_INFO_URL 部门信息查询接口</li>
	 * </ul>
	 * @author quan
	 *
	 */
	/*public static enum URL {
		AUTHENTICATION_URL("http://" + IP + ":" + PORT + "/epass-controller/authentication.do"),
		CITIZEN_INFO_URL("http://" + IP + ":" + PORT + "/epass-controller/citizenInfo.do"),
		STATUS_URL("http://" + IP + ":" + PORT + "/epass-controller/getStatus.do"),
		AREA_INFO_URL("http://" + IP + ":" + PORT + "/epass-controller/getAreaInfo.do"),
		HOUSE_HOLD_INFO_URL("http://" + IP + ":" + PORT + "/epass-controller/getHouseHoldInfo.do"),
		DEPT_INFO_URL("http://" + IP + ":" + PORT + "/epass-controller/getDeptInfo.do");
		
		private String url;
		
		URL(String url) {
			this.url = url;
		}
		
		public String getUrl() {
			return this.url;
		}
	}*/
	
	public static String getKey(String userName, String userPassword) {
		return userName + SEPARATOR + userPassword;
	}
	
	
	public static final String AUTHENTICATION_URL = "http://" + IP + ":" + PORT + "/epass-controller/authentication.do";
	/**
	 * 登录企业账号
	 <pre>
	 	请求参数说明：
		参数名	是否必须	类型	说明
		userName	Y	String	登录名
		userPassword	Y	String	密码(密文)
		
		返回消息说明
		Json类型对象
		参数名	类型	说明
		token	String	请求密钥（服务端生成）
		status	String	状态码(0:成功，-1：失败，-2：系统异常)
		content	String	失败详情
		companyCode	String 	该账户对应的企业代码
	 </pre>
	 * @param userName
	 * @param userPassword
	 * @return
	 * @throws Exception 
	 */
	public static Authentication getAuthentication(String userName, String userPassword) throws Exception {
		Map<String, String> parameters = new HashMap<String, String>();
		Authentication authentication = authentications.get(getKey(userName, userPassword));
		
		if(authentication != null && (authentication.getInterval() < EXPIRE_TIME)) {
			return authentication;
		}
		
		parameters.put("userName", userName);
		parameters.put("userPassword", userPassword);
		String result = HttpKit.post(AUTHENTICATION_URL, JSON.toJSONString(parameters));
		JSONObject resultJSON = JSON.parseObject(result);
		
		if(!"0".equals(resultJSON.getString("status"))) {
			throw new Exception(result);
		}
		
		authentication = new Authentication(userName, userPassword, resultJSON.getString("token"), resultJSON.getString("companyCode"));
		authentications.put(getKey(userName, userPassword), authentication);
		
		return authentication;
	}
	
	
	public static final String CITIZEN_INFO_URL = "http://" + IP + ":" + PORT + "/epass-controller/citizenInfo.do";
	/**
	 * 提交人员制证信息</br>
	 <pre>
	 请求参数说明
	名称	是否必须	类型	说明
	token	Y	String	请求密钥（服务端生成 有效期一小时）
	idcardNo	Y	String	人员证件号
	name	Y	String	人员姓名
	birthday	Y	String	出生日期(yyyyMMdd)
	sex	Y	String	性别（01:男，02：女）
	nationality	Y	String	民族代码
	birthAddressDetail	Y	String	常住户口地址(详见5.户籍地区信息获取接口)
	birthAddressCode	Y	String 	户籍地区代码(详见5.户籍地区信息获取接口)
	birthAddressArea	Y	String	户籍地区(详见5.户籍地区信息获取接口)
	safetyTraining	Y	String	是否参加安全培训(是/否)
	typeWork	Y	String	工种
	islandStatus	Y	int	在岛状态（0：离岛，1：在岛）
	idcardType	Y	String	证件类型:0 身份证 1 护照，2 港澳通行证，3台湾通行证
	livingAddress	Y	String	人员居住地址全名
	contactInfo	Y	String	人员联系方式
	employmentDate	Y	String	就业日期(yyyy-MM-dd HH:mm:ss)
	regDate	Y	String	登岛日期(yyyy-MM-dd)
	companyCode	Y	String	所属公司代码(认证接口返回的参数)
	passStatus	Y	int 	进出状态（1：进，7：出）
	livingDate	Y	string	居住时间(yyyy-MM-dd HH:mm:ss)
	education	Y	String	文化程度
	maritalStatus	Y	String	婚姻情况
	livingMatter	Y	String	居住事由
	livingType	Y	String	34租赁房屋
	politicalStatus	Y	String	政治面貌
	occupation	Y	String	从事职业
	livingArCode	Y	string	3.	所属连队代码 详见4.所属连队查询接口
	cardType	N	string	卡类型（1.居住证IC卡，2.临时卡） 
	issueAuthority	N	String	签发机关 “浙江省岱山县公安局”
	issueDate	N	String	签发日期(yyyy-MM-dd)
	acceptSite	N	String	受理网点代码
	policeStationCode	N	String 	居住地派出所代码
	policeStationName	N	String	居住地派出所名称
	serviceNumber	N	String	服务热线 “0580-88888888”
	expiringDate	N	String	到期日期(yyyyMMdd)
	notes	N	String	备注
	deptCode	N	String	部门代码 详见6.部门信息查询接口
	
	返回消息说明:
	参数名	类型	说明
	status	String	状态码
	content	String	失败原因
	 </pre>
	 * @param parameters
	 * @return
	 * @throws Exception 
	 */
	public static String submitCitizenInfo(String userName, String userPassword, Map<String, String> parameters) throws Exception {
		Authentication authentication = getAuthentication(userName, userPassword);
		parameters.put("token", authentication.getToken());
		parameters.put("companyCode", authentication.getCompanyCode());
		
		return HttpKit.post(CITIZEN_INFO_URL, JSON.toJSONString(parameters));
	}
	
	
	public static final String STATUS_URL = "http://" + IP + ":" + PORT + "/epass-controller/getStatus.do";
	/**
	 * 查询人员制证状态
	 <pre>
	 请求参数说明
	名称	是否必须	类型	说明
	token	Y	String	密钥（服务端生成）
	idcardType	Y	String	证件类型:0 身份证 1 护照，2 港澳通行证，3台湾通行证
	idcardNo	Y	String	查询证件号
	
	返回参数
	名称	类型	说明
	status	String	0成功 -1失败 -2系统错误
	content	String 	失败原因
	idcardNo	String	身份证号 
	residenceCardType	String	居住证卡类型(1-居住证IC卡，2-临时卡)
	cardStatus	String	卡片状态(MKI:写卡中，MKF:写卡失败，NORM:正常(制卡完成)，DROP:挂失，CANL:注销)
	 </pre>
	 * @param parameters
	 * @return
	 * @throws Exception 
	 */
	public static String getStatus(String userName, String userPassword, Map<String, String> parameters) throws Exception {
		Authentication authentication = getAuthentication(userName, userPassword);
		parameters.put("token", authentication.getToken());
		
		return HttpKit.post(STATUS_URL, JSON.toJSONString(parameters));
	}
	
	
	public static final String AREA_INFO_URL = "http://" + IP + ":" + PORT + "/epass-controller/getAreaInfo.do";
	/**
	 * 查询所属连队
	 <pre>
	 请求参数说明：
	参数名	是否必须	类型	说明
	token	Y	String	请求密钥（服务端生成）

	返回参数
	名称	类型	说明
	status	String	0成功 -1失败 -2系统错误
	areaList	List	返回所属连队信息列表 
	area_code	String	所属连队代码
	area_cname	String	所属连队名称
	area_parentcode	String 	所属连队父级代码
	area_cname_detail	String 	所属连队名称详细描述
	 </pre>
	 * @param parameters
	 * @return
	 * @throws Exception 
	 */
	public static String getAreaInfo(String userName, String userPassword) throws Exception {
		Authentication authentication = getAuthentication(userName, userPassword);
		Map<String, String> parameters = new HashMap<String, String>();
		parameters.put("token", authentication.getToken());
		
		return HttpKit.post(AREA_INFO_URL, JSON.toJSONString(parameters));
	}
	
	
	public static final String HOUSE_HOLD_INFO_URL = "http://" + IP + ":" + PORT + "/epass-controller/getHouseHoldInfo.do";
	/**
	 * 查询户籍地区信息
	 <pre>
	 请求参数说明：
	参数名	是否必须	类型	说明
	token	Y	String	请求密钥（服务端生成）
	
	返回参数
	名称	类型	说明
	status	String	0成功 -1失败 -2系统错误
	content	String	失败原因
	houseHoldList	List	返回户籍信息列表 
	city	String	地市代码
	fullName	String	全称
	householdNo	String 	户籍地区代码
	isAllowed	String 	YES/NO  是否允许户籍地区代码为当前代码
	name	String	户籍地区名称
	province	String	省份代码
	shortName	String	简化后名称
	town	String	区县代码
	 </pre>
	 * @param parameters
	 * @return
	 * @throws Exception 
	 */
	public static String getHouseHoldInfo(String userName, String userPassword) throws Exception {
		Authentication authentication = getAuthentication(userName, userPassword);
		Map<String, String> parameters = new HashMap<String, String>();
		parameters.put("token", authentication.getToken());
		
		return HttpKit.post(HOUSE_HOLD_INFO_URL, JSON.toJSONString(parameters));
	}
	
	
	public static final String DEPT_INFO_URL = "http://" + IP + ":" + PORT + "/epass-controller/getDeptInfo.do";
	/**
	 * 查询部门信息
	 <pre>
	 请求参数说明：
	参数名	是否必须	类型	说明
	token	Y	String	请求密钥（服务端生成）

	返回参数
	名称	类型	说明
	status	String	0成功 -1失败 -2系统错误
	deptList	List	部门信息列表 
	pk_id	Int	序号
	deptCode	String	部门编号
	deptName	String 	部门名称
	deptParentcode	String 	部门上级节点
	 </pre>
	 * @param parameters
	 * @return
	 * @throws Exception 
	 */
	public static String getDeptInfo(String userName, String userPassword) throws Exception {
		Authentication authentication = getAuthentication(userName, userPassword);
		Map<String, String> parameters = new HashMap<String, String>();
		parameters.put("token", authentication.getToken());
		
		return HttpKit.post(DEPT_INFO_URL, JSON.toJSONString(parameters));
	}
	
	
	
	
	public static void main(String[] args) throws Exception {
		Map<String, String> parameters = new HashMap<String, String>();
		
		/*************************/
		
		/*parameters.put("name", "dyci");
		parameters.put("birthday", "19901111");
		parameters.put("sex", "01");
		parameters.put("nationality", "26");
		parameters.put("birthAddressDetail", "birthAddressDetail");
		parameters.put("birthAddressCode", "1111");
		parameters.put("safetyTraining", "是");
		parameters.put("typeWork", "自由");
		parameters.put("islandStatus", "1");
		parameters.put("livingAddress", "人员居住地址全名");
		parameters.put("contactInfo", "188888888888");
		parameters.put("employmentDate", "19901111");
		parameters.put("regDate", "19901111");
		parameters.put("passStatus", "1");
		parameters.put("livingDate", "19901111");
		parameters.put("education", "00");
		parameters.put("maritalStatus", "90");
		parameters.put("livingMatter", "99");
		parameters.put("livingType", "69");
		parameters.put("politicalStatus", "5");
		parameters.put("occupation", "51");
		parameters.put("livingArCode", "0001");*/
		
		/*************************/
		
		System.out.println(JSON.toJSONString(getHouseHoldInfo(userName, userPassword)));
		/*System.out.println(JSON.toJSONString(getAreaInfo(userName, userPassword)));*/
		
		parameters.put("idcardType", "0");
		parameters.put("idcardNo", "330326199011116111");
		/*System.out.println(JSON.toJSONString(getStatus(userName, userPassword, parameters)));
		System.out.println(JSON.toJSONString(submitCitizenInfo(userName, userPassword, parameters)));*/
	}
}
